//搭建服务器入口文件
// 引入Express框架，用于创建Web服务器
const express = require("express");
// 创建Express应用实例
const app = express();
// 引入path模块，用于处理文件路径
const path = require("path");
// 引入url模块，用于处理URL
const url = require("url");
// 引入querystring模块，用于处理URL查询字符串
const qs = require("querystring");
// 引入fs模块，用于进行文件操作
const fs = require("fs");

// 引入crypto模块，用于提供加密功能
const crypto = require("crypto");

function generateRandomHash() {
  // 生成一个随机的Buffer
  const randomData = crypto.randomBytes(16); // 16字节长度
  // 创建一个哈希对象
  const hash = crypto.createHash("sha256");
  // 更新哈希对象的内容
  hash.update(randomData);
  // 计算哈希值
  const hashValue = hash.digest("hex"); // 以十六进制字符串形式返回哈希值
  return hashValue;
}


//处理静态目录，发送前端想要的文件
app.use(express.static("./public")); //  使用Express中间件来托管静态文件 express.static是Express内置的中间件函数，用于提供静态文件 "public"参数指定了静态文件的目录名称，即public文件夹 这样设置后，public文件夹中的所有文件都可以被公开访问

//首页文件的发送逻辑
app.get("/", (req, res) => {
  res.sendFile(path.resolve("./public/Home.html")); //  使用 Express 框架的 sendFile 方法发送静态文件 path.resolve() 用于将相对路径转换为绝对路径，确保无论从哪里调用都能正确找到文件 这里指定了要发送的文件是 public 目录下的 Home.html
});
app.get("/introduce", (req, res) => {
  res.sendFile(path.resolve("./public/introduce.html"));
});
app.get("/challenge", (req, res) => {
  res.sendFile(path.resolve("./public/challenge.html"));
});
app.get("/game",(req,res)=>{
  res.sendFile(path.resolve("./public/Game.html"));
})
//首页获取文章列表数据
/**
 * 获取情感类文章的API路由处理函数
 * @param {Object} req - Express请求对象
 * @param {Object} res - Express响应对象
 */
app.get("/getEmotionArticle", (req, res) => {
  // 读取本地JSON文件
  fs.readFile("./data.json", "utf-8", (err, data) => {
    // 解析JSON数据并过滤出情感类别的文章
    let data1 = JSON.parse(data).filter((item, index) => {
      return item.category == "emot"; // 筛选条件：类别为"emot"的文章
    });
    // 将过滤后的数据以JSON格式返回给客户端
    res.json(data1);
  });
});
//技术文件的发送逻辑
/**
 * 处理IT技术页面路由
 * 当用户访问/t路径时，返回Technology.html页面
 */
app.get("/t", (req, res) => {
  res.sendFile(path.resolve("./public/Technology.html"));
});
//IT技术获取文章列表数据的路由处理
// 当前端请求/getTechnologyArticle路径时，读取并返回technology分类的文章数据
/**
 * 处理获取技术类文章的请求
 * 当访问 /getTechnologyArticle 路径时，会读取 data.json 文件
 * 并筛选出类别为"technology"的文章返回给客户端
 */
app.get("/getTechnologyArticle", (req, res) => {
  // 读取 data.json 文件，使用 utf-8 编码
  // 读取data.json文件
  // 将读取的 JSON 数据解析为对象，并过滤出类别为"technology"的文章
  fs.readFile("./data.json", "utf-8", (err, data) => {
    // 解析JSON数据并过滤出technology分类的文章
    let data2 = JSON.parse(data).filter((item, index) => {
      // 将筛选后的数据以 JSON 格式返回给客户端
      return item.category == "technology";
    });
    // 将过滤后的数据以JSON格式返回给前端
    res.json(data2);
  });
});
//文章页面的发送逻辑
app.get("/page", (req, res) => {
  res.sendFile(path.resolve("./public/Page.html"));
});
//文章页面的数据发送逻辑
app.get("/getDataByid", (req, res) => {
  //对象的解构
  // 使用Node.js的文件系统模块读取文件
  fs.readFile("./data.json", "utf-8", (err, data) => {
    // 解析URL查询字符串，提取查询参数
    const { wd } = qs.parse(url.parse(req.url).query);
    // 将JSON数据解析为JavaScript对象，并根据ID进行过滤
    const filterdata = JSON.parse(data).filter((item, index) => {
      // 返回匹配ID的数据项
      return item.id == wd;
    })[0]; // 获取过滤后的第一个元素
    // 将过滤后的数据以JSON格式发送给客户端
    res.json(filterdata);
  });
});
//添加文章页面获取
app.get("/p", (req, res) => {
  res.sendFile(path.resolve("./public/Insert.html"));
});
//添加文章页面获取
app.post("/postArticleData", (req, res) => {
  let str = "";
  req.on("data", (chunk) => {
    str += chunk;
  });
  req.on("end", () => {
// 解析JSON字符串，将其转换为JavaScript对象
    let obj = JSON.parse(str);
// 为对象生成并分配一个随机哈希ID
    obj.id = generateRandomHash();
// 初始化收藏计数为0
    obj.fav = 0;
// 初始化评论计数为0
    obj.commend = 0;
    //1.读取JSON文件中的数组
    fs.readFile("./data.json", "utf-8", (err, data) => {
      let now = JSON.parse(data);
      //2.添加对象到数组中
      now.push(obj);
      //3.重新写入JSON文件
      fs.writeFile("./data.json", JSON.stringify(now), (err) => {
        res.json({
          message: "文章发布成功",
        });
      });
    });
  });
});
app.listen(3000);
